package com.github.lwhite1.tablesaw.io.html;

import com.github.lwhite1.tablesaw.api.Table;
import com.github.lwhite1.tablesaw.columns.Column;
import com.google.common.annotations.VisibleForTesting;
import org.apache.commons.lang3.StringUtils;

import java.util.List;

/**
 * Static utility that Writes outlier tables in html table format for display
 */
final public class HtmlTableWriter {

  /**
   * Private constructor to prevent instantiation
   */
  private HtmlTableWriter() {}

  public static String write(Table table, String missing) {

    StringBuilder builder = new StringBuilder();
    builder.append(header(table.columnNames()));
    builder.append("<tbody>")
        .append('\n');
    for (int row : table.rows()) {
      builder.append(row(row, table, missing));
    }
    builder.append("</tbody>");
    return builder.toString();
  }

  /**
   * Returns a string containing the html output of one table row
   */
  @VisibleForTesting
  static String row(int row, Table table, String missing) {
    StringBuilder builder = new StringBuilder()
        .append("<tr>");

    for (Column col : table.columns()) {
      builder
          .append("<td>")
          .append(String.valueOf(col.getString(row)))
          .append("</td>");
      }
    builder
        .append("</tr>")
        .append('\n');
    return builder.toString();
  }

  @VisibleForTesting
  static String header(List<String> columnNames) {
    StringBuilder builder = new StringBuilder()
        .append("<thead>")
        .append('\n')
        .append("<tr>");
    for (String name : columnNames) {
      builder
          .append("<th>")
          .append(splitCamelCase(splitOnUnderscore(name)))
          .append("</th>");
    }
    builder
        .append("</tr>")
        .append('\n')
        .append("</thead>")
        .append('\n');

    return builder.toString();
  }

  // todo move to utils
  private static String splitCamelCase(String s) {
    return StringUtils.join(
        StringUtils.splitByCharacterTypeCamelCase(s),
        ' '
    );
  }

  // todo move to utils
  static String splitOnUnderscore(String s) {
    return StringUtils.join(
        StringUtils.split(s, '_'),
        ' '
    );
  }
}